🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / app / src / main / java / com / geeksville / mesh / ui / settings / radio / CleanNodeDatabaseScreen.kt
Displaying Raw • Download
app/src/main/java/com/geeksville/mesh/ui/settings/radio/CleanNodeDatabaseScreen.kt ui_message_list (be3f882f) Text, 7.87 KB
T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787com.geeksville.mesh.ui.settings.radio
Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.FlowRow
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.Spacer
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.height
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.rememberScrollState
Tff7b72import T7ee787androidx.compose.foundation.verticalScroll
Tff7b72import T7ee787androidx.compose.material3.AlertDialog
Tff7b72import T7ee787androidx.compose.material3.Button
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.Slider
Tff7b72import T7ee787androidx.compose.material3.Switch
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.material3.TextButton
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.collectAsState
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.res.stringResource
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.hilt.navigation.compose.hiltViewModel
Tff7b72import T7ee787com.geeksville.mesh.R
Tff7b72import T7ee787com.geeksville.mesh.database.entity.NodeEntity
Tff7b72import T7ee787com.geeksville.mesh.ui.node.components.NodeChip
T8b949e/**
* Composable screen for cleaning the node database. Allows users to specify criteria for deleting nodes. The list of
* nodes to be deleted updates automatically as filter criteria change.
*/
Tf0883e@Composable
Tff7b72fun Td2a8ffCleanNodeDatabaseScreenTb4b4b4(Te6edf3viewModelTb4b4b4: Te6edf3CleanNodeDatabaseViewModel Tff7b72= Te6edf3hiltViewModelTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3olderThanDays Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3olderThanDaysTb4b4b4.Te6edf3collectAsStateTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3onlyUnknownNodes Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3onlyUnknownNodesTb4b4b4.Te6edf3collectAsStateTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3nodesToDelete Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3nodesToDeleteTb4b4b4.Te6edf3collectAsStateTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3showConfirmationDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Te6edf3LaunchedEffectTb4b4b4(Te6edf3olderThanDaysTb4b4b4, Te6edf3onlyUnknownNodesTb4b4b4) Tb4b4b4{ Te6edf3viewModelTb4b4b4.Te6edf3getNodesToDeleteTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showConfirmationDialogTb4b4b4) Tb4b4b4{
Te6edf3ConfirmationDialogTb4b4b4(
Te6edf3nodesToDeleteCount Tff7b72= Te6edf3nodesToDeleteTb4b4b4.Te6edf3sizeTb4b4b4,
Te6edf3onConfirm Tff7b72= Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3cleanNodesTb4b4b4(Tb4b4b4)
Te6edf3showConfirmationDialog Tff7b72= Tff7b72false
Tb4b4b4}Tb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showConfirmationDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4.Te6edf3verticalScrollTb4b4b4(Te6edf3rememberScrollStateTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3clean_node_database_titleTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3clean_node_database_descriptionTb4b4b4)Tb4b4b4, Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodySmallTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3DaysThresholdFilterTb4b4b4(
Te6edf3olderThanDays Tff7b72= Te6edf3olderThanDaysTb4b4b4,
Te6edf3onlyUnknownNodes Tff7b72= Te6edf3onlyUnknownNodesTb4b4b4,
Te6edf3onDaysChanged Tff7b72= Te6edf3viewModelTff7b72::Te6edf3onOlderThanDaysChangedTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3UnknownNodesFilterTb4b4b4(Te6edf3onlyUnknownNodes Tff7b72= Te6edf3onlyUnknownNodesTb4b4b4, Te6edf3onCheckedChanged Tff7b72= Te6edf3viewModelTff7b72::Te6edf3onOnlyUnknownNodesChangedTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff3T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3NodesDeletionPreviewTb4b4b4(Te6edf3nodesToDelete Tff7b72= Te6edf3nodesToDeleteTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3ButtonTb4b4b4(
Te6edf3onClick Tff7b72= Tb4b4b4{ Tff7b72if Tb4b4b4(Te6edf3nodesToDeleteTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3showConfirmationDialog Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3enabled Tff7b72= Te6edf3nodesToDeleteTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3clean_nowTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72const Tff7b72val Te6edf3MIN_UNKNOWN_DAYS_THRESHOLD Tff7b72= T79c0ff0f
Tff7b72private Tff7b72const Tff7b72val Te6edf3MIN_KNOWN_DAYS_THRESHOLD Tff7b72= T79c0ff7f
Tff7b72private Tff7b72const Tff7b72val Te6edf3MAX_DAYS_THRESHOLD Tff7b72= T79c0ff3T79c0ff6T79c0ff5f
T8b949e/**
* Composable for the "older than X days" filter. This filter is always active.
*
* @param olderThanDays The number of days for the filter.
* @param onlyUnknownNodes Whether the "only unknown nodes" filter is enabled.
* @param onDaysChanged Callback for when the number of days changes.
*/
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDaysThresholdFilterTb4b4b4(Te6edf3olderThanDaysTb4b4b4: Tffa657FloatTb4b4b4, Te6edf3onlyUnknownNodesTb4b4b4: Tffa657BooleanTb4b4b4, Te6edf3onDaysChangedTb4b4b4: Tb4b4b4(Tffa657FloatTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3valueRange Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3onlyUnknownNodesTb4b4b4) Tb4b4b4{
Te6edf3MIN_UNKNOWN_DAYS_THRESHOLDTb4b4b4.Tb4b4b4.Te6edf3MAX_DAYS_THRESHOLD
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3MIN_KNOWN_DAYS_THRESHOLDTb4b4b4.Tb4b4b4.Te6edf3MAX_DAYS_THRESHOLD
Tb4b4b4}
Tff7b72val Te6edf3steps Tff7b72= Tb4b4b4(Te6edf3valueRangeTb4b4b4.Te6edf3endInclusive Tff7b72- Te6edf3valueRangeTb4b4b4.Te6edf3start Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3coerceAtLeastTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3bottom Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3clean_nodes_older_thanTb4b4b4, Te6edf3olderThanDaysTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3SliderTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3value Tff7b72= Te6edf3olderThanDaysTb4b4b4,
Te6edf3onValueChange Tff7b72= Te6edf3onDaysChangedTb4b4b4,
Te6edf3valueRange Tff7b72= Te6edf3valueRangeTb4b4b4,
Te6edf3steps Tff7b72= Te6edf3stepsTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Composable for the "only unknown nodes" filter.
*
* @param onlyUnknownNodes Whether the filter is enabled.
* @param onCheckedChanged Callback for when the checked state changes.
*/
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffUnknownNodesFilterTb4b4b4(Te6edf3onlyUnknownNodesTb4b4b4: Tffa657BooleanTb4b4b4, Te6edf3onCheckedChangedTb4b4b4: Tb4b4b4(Tffa657BooleanTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3clean_unknown_nodesTb4b4b4)Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4)
Te6edf3SwitchTb4b4b4(Te6edf3checked Tff7b72= Te6edf3onlyUnknownNodesTb4b4b4, Te6edf3onCheckedChange Tff7b72= Te6edf3onCheckedChangedTb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Composable for displaying the list of nodes queued for deletion.
*
* @param nodesToDelete The list of nodes to be deleted.
*/
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffNodesDeletionPreviewTb4b4b4(Te6edf3nodesToDeleteTb4b4b4: Te6edf3ListTff7b72<Te6edf3NodeEntityTff7b72>Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3nodes_queued_for_deletionTb4b4b4, Te6edf3nodesToDeleteTb4b4b4.Te6edf3sizeTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3bottom Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3FlowRowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3CenterTb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3nodesToDeleteTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3node Tff7b72-Tff7b72>
Te6edf3NodeChipTb4b4b4(
Te6edf3node Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3toModelTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3end Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4, Te6edf3bottom Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3isThisNode Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3isConnected Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4) Tb4b4b4{Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Composable for the confirmation dialog before deleting nodes.
*
* @param nodesToDeleteCount The number of nodes to be deleted.
* @param onConfirm Callback for when the user confirms the deletion.
* @param onDismiss Callback for when the user dismisses the dialog.
*/
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffConfirmationDialogTb4b4b4(Te6edf3nodesToDeleteCountTb4b4b4: Tffa657IntTb4b4b4, Te6edf3onConfirmTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3AlertDialogTb4b4b4(
Te6edf3onDismissRequest Tff7b72= Te6edf3onDismissTb4b4b4,
Te6edf3title Tff7b72= Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3are_you_sureTb4b4b4)Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3text Tff7b72= Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3clean_node_database_confirmationTb4b4b4, Te6edf3nodesToDeleteCountTb4b4b4)Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3confirmButton Tff7b72= Tb4b4b4{ Te6edf3ButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onConfirmTb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3clean_nowTb4b4b4)Tb4b4b4) Tb4b4b4} Tb4b4b4}Tb4b4b4,
Te6edf3dismissButton Tff7b72= Tb4b4b4{ Te6edf3TextButtonTb4b4b4(Te6edf3onClick Tff7b72= Te6edf3onDismissTb4b4b4) Tb4b4b4{ Te6edf3TextTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3RTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3cancelTb4b4b4)Tb4b4b4) Tb4b4b4} Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Served by rngit 1.5.1 - Generated in 0.07s